#include "ota_http_curl.h"
#include "curl/curl.h"
#include "string.h"
#include "stdlib.h"
/**
 * 定义data如何接收到用户的容器中（结构体）
 * 1.计算数据长度
 * 2.把userdata强转为 responsebody*
 * 3.创建responsebody中的str 根据世纪数据长度申请空间 长度+1
 * 4.把data数据拷贝到str中
 * 5.把长度赋值给responsebody中的len
 */
size_t ota_http_write_callback(char *data, size_t size, size_t nmemb, void *userdata)
{
    //    1.计算数据长度
    size_t len = size * nmemb;
    //  * 2.把userdata强转为 responsebody*
    ResponseBody *response_body = (ResponseBody *)userdata;
    //  * 3.创建responsebody中的str 根据世纪数据长度申请空间 长度+1
    response_body->str = (char *)malloc(len + 1);
    //  * 4.把data数据拷贝到str中
    memcpy(response_body->str, data, len);
    // 补充 结束符
    response_body->str[len] = '\0';
    //  * 5.把长度赋值给responsebody中的len
    response_body->len = len + 1;
    return len;
}
/**
 * 访问网络url，获得对应的文本数据
 * 1.初始化url
 * 2.给url设置参数：1.要访问的地址 2.如果获得文本数据，如何接收的回调函数 3.回调函数接收的容器(提前开辟内存空间)
 * 3.执行访问 perform
 * 4.清理cleanup
 */
ResponseBody *ota_http_get(const char *url)
{
    CURL *curl = curl_easy_init();
    if (curl == NULL)
    {
        return NULL;
    }
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ota_http_write_callback);
    ResponseBody *response = (ResponseBody *)malloc(sizeof(ResponseBody));
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, response);

    CURLcode res = curl_easy_perform(curl);
    if (res != CURLE_OK)
    {
        curl_easy_cleanup(curl);
        free(response);
        return NULL;
    }

    curl_easy_cleanup(curl);
    return response;
}

/**
 * 访问url，下载对应的二进制文件
 */
int ota_http_download(const char *url, const char *file_name)
{
     CURL *curl = curl_easy_init();
    if (curl == NULL)
    {
        return -1;
    }
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ota_http_write_callback);
    FILE * file = fopen(file_name, "wb");
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
    CURLcode res = curl_easy_perform(curl);
    if (res != CURLE_OK)
    {
        curl_easy_cleanup(curl);
        fclose(file);
        return -1;
    }
    curl_easy_cleanup(curl);
    fclose(file);
    return 0;
}